package br.com.toscano.contpedido.view;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.inject.Inject;

import br.com.toscano.contpedido.business.FuncionalidadeBC;
import br.com.toscano.contpedido.business.PerfilBC;
import br.com.toscano.contpedido.domain.Funcionalidade;
import br.com.toscano.contpedido.domain.Perfil;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractEditPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;

@ViewController
@PreviousView("./perfil_list.jsf")
public class PerfilEditMB extends AbstractEditPageBean<Perfil, Long> {

	private static final long serialVersionUID = 1L;

	@Inject
	private PerfilBC perfilBC;
	
	@Inject
	private FuncionalidadeBC funcionaldiadeBCB;

	@Override
	@Transactional
	public String delete() {
		this.perfilBC.delete(getId());
		return getPreviousView();
	}
	
	public void montarObjeto() {

		List<Funcionalidade> funcionalidades = getSelectedFuncionlidade();
		
		this.getBean().setListaFuncionalidade(funcionalidades);
	}
	
	@Override
	@Transactional
	public String insert() {
		montarObjeto();
		this.perfilBC.insert(getBean());
		return getPreviousView();
	}
	
	@Override
	@Transactional
	public String update() {
		montarObjeto();
		this.perfilBC.update(getBean());
		return getPreviousView();
	}
	
	@Override
	protected Perfil handleLoad(Long id) {
		setBean(this.perfilBC.load(id));
		
		getItemsFuncionlidade();
		
		if(this.getBean() != null && this.getBean().getListaFuncionalidade() != null) {
			for (Funcionalidade pa : itemsFuncionlidade) {
				for (Funcionalidade paCadastrado : this.getBean().getListaFuncionalidade()) {
					if (pa.equals(paCadastrado)) {
						checkMapFuncionlidade.put(pa, new Boolean(true));
					}
				}
				if (checkMapFuncionlidade.get(pa) == null ) {
					checkMapFuncionlidade.put(pa, new Boolean(false));
				}
			}
		}


		return this.getBean();
	}
	
	private Map<Funcionalidade,Boolean> checkMapFuncionlidade = new HashMap<Funcionalidade,Boolean>();

	private List<Funcionalidade> itemsFuncionlidade;
	
	
	public List<Funcionalidade> getItemsFuncionlidade() {
		if (itemsFuncionlidade == null) {
			itemsFuncionlidade = this.funcionaldiadeBCB.findAll();
		}
		return itemsFuncionlidade;
	}

	public Map<Funcionalidade, Boolean> getCheckMapFuncionlidade() {
		
		return checkMapFuncionlidade;
	}
	
	public List<Funcionalidade> getSelectedFuncionlidade() {
		List<Funcionalidade> result = new ArrayList<Funcionalidade>();
		
	    for (Entry<Funcionalidade,Boolean> entry : checkMapFuncionlidade.entrySet()) {
	        if (entry.getValue()) {
	            result.add(entry.getKey());
	        }
	    }
	    return result;
	}
}